www.gusucode.com > FreeEIM_VC++企业即时通讯软件源代码源码程序 > FreeEIM_VC++企业即时通讯软件源代码源码程序\code\dev notebook.txt

    2008-2-27
写 FreeEIM 时,在判断新用户是否本机用户时,犯了一个语法问题:
用到的函数:
1. BOOL IsMyself(EM_USERINFO &ui);
如果新用户是本机时,返回TRUE,当新用户不是本机时,返回FALSE。
2. BOOL IsNewUser(EM_USERINFO &ui);
如果新用户已存在返回FALSE,新用户不存在返回TRUE。

然后在函数BOOL AddNewUser(EM_USERINFO &ui);中判断错了,我开始时这样写的:
BOOL AddNewUser(EM_USERINFO &ui)
{
        // 不是新用户或是本机用户就返回
        if (!IsNewUser(ui) && IsMyself(ui))
                return FALSE;
	else
                AddUserToList();//虚代码
}

但代码不能达到预期的效果,测试了一下,发现问题出在 if 里的 && 上。
这是逻辑与运算符,逻辑‘与’运算符的用法如下:
1 && 1 = 1
1 && 0 = 0
当 IsNewUser 返回TRUE,IsMyself 返回FALSE,才执行后面的 return 语句。

研究了一下,我应该用 || 逻辑‘或’运算符,代码改成:
BOOL AddNewUser(EM_USERINFO &ui)
{
        // 不是新用户或是本机用户就返回
        if (!IsNewUser(ui) || IsMyself(ui))
                return FALSE;
	else
                AddUserToList();//虚代码
}

这样就能达到预期的效果了。

总结:
逻辑运算符使用简单,但写代码是常常会犯逻辑错误。
写逻辑算法是,最好先把预期的返回值写出来然后这样对比一下:
1 && 1 = 1
1 && 0 = 0
1 || 1 = 1
1 || 0 = 0
这样,可能就知道那里逻辑有错误。

注:
在网友荆人的建议下,我们决定 FreeEIM 在登录后